package com.nd.android.musicboxlibrary.ui.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import com.nd.android.musicboxlibrary.ui.common.UnMixable;
import com.nd.android.musicboxlibrary.ui.common.ViewInjectorWithReflect;

import java.util.ArrayList;
import java.util.List;

/**
 * 通用adapter 所有adapter 继承该类 仅限于单个item 类型。 多类型 使用@see AbstractMultiAdapter
 * 
 * @param <D>
 *            行对应数据的泛类型
 * @param <V>
 *            行控件对应的索引类
 * @author davidleen29
 */
public abstract class AbstractAdapter<D, V extends UnMixable> extends BaseAdapter {

    protected Context mContext;

    private List<D> datas;

    protected LayoutInflater layoutInflater;

    protected String TAG;

    /**
     * Creates a new instance of AbstractAdapter. <br>
     * Created 2014年9月15日 下午11:11:13
     * 
     * @param context Context
     */
    public AbstractAdapter(Context context) {
        this(context, null);
    }

    /**
     * Creates a new instance of AbstractAdapter. <br>
     * Created 2014年9月15日 下午11:11:17
     * 
     * @param context Context
     * @param data List<D>
     */
    public AbstractAdapter(Context context, List<D> data) {

        this.mContext = context;
        TAG = this.getClass().getName();
        if (data == null) {
            this.datas = new ArrayList<D>();
        } else {
            this.datas = data;
        }

        layoutInflater = (LayoutInflater) mContext
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    }

    /**
     * 设置数据源
     * 
     * @param newDatas List<D>
     */
    public void setDatas(List<D> newDatas) {
        setDatas(newDatas, false);

    }

    /**
     * 
     * <br>
     * Created 2014年9月15日 下午11:10:43
     * 
     * @return List<D>
     * @author wat.ztag
     */
    public List<D> getDatas() {
        return datas;
    }

    /**
     * 
     * <br>
     * Created 2014年9月15日 下午11:10:53
     * 
     * @param newDatas List<D>
     * @param isMore boolean
     * @author wat.ztag
     */
    public void setDatas(List<D> newDatas, boolean isMore) {
        if (!isMore) {
            datas.clear();
        }

        if (newDatas != null) {
            datas.addAll(newDatas);
        }
        notifyDataSetChanged();

    }

    @Override
    public int getCount() {
        if (datas == null) {
            return 0;
        }
        return datas.size();
    }

    @Override
    public D getItem(int position) {
        return datas.get(position);
    }

    @Override
    public long getItemId(int position) {

        return position;
    }

    /**
     * 
     * <br>
     * Created 2014年9月15日 下午11:10:58
     * 
     * @return V
     * @author wat.ztag
     */
    protected abstract V getNewHolder();

    @SuppressWarnings("unchecked")
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        V viewHolder = null;
        if (convertView == null) {
            convertView = layoutInflater.inflate(getItemLayout(), null);
            viewHolder = getNewHolder();

            ViewInjectorWithReflect.injectView(viewHolder, convertView);
            convertView.setTag(viewHolder);
        } else {

            viewHolder = (V) convertView.getTag();

        }
        bindView(viewHolder, getItem(position), position);
        return convertView;
    }

    /**
     * 
     * <br>
     * Created 2014年9月15日 下午11:11:02
     * 
     * @return int
     * @author wat.ztag
     */
    protected abstract int getItemLayout();

    /**
     * 
     * <br>
     * Created 2014年9月15日 下午11:11:06
     * 
     * @param holder V
     * @param data D
     * @param position int
     * @author wat.ztag
     */
    public abstract void bindView(V holder, D data, int position);

    /**
     * 
     * <br>
     * Created 2014年9月15日 下午11:11:09
     * 
     * @return Context
     * @author wat.ztag
     */
    protected Context getContext() {
        return mContext;
    }

}
